import axios from "axios";
import { ElMessage } from "element-plus";

//{baseURL: '/api'}
const instance = axios.create();


// axios 请求拦截
instance.interceptors.request.use(
  config => {
    // 从 localStorage 直接读取 token，避免循环依赖问题
    // pinia-persistedstate-plugin 会将数据存储在 localStorage 中
    const userInfoData = localStorage.getItem('userInfo')
    if (userInfoData) {
      try {
        const userData = JSON.parse(userInfoData)
        const token = userData.token

        // 获取token并添加到请求头（后端从 'token' 字段获取）
        if (token) {
          config.headers['token'] = token
        }
      } catch (e) {
        console.error('解析token失败:', e)
      }
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// axios 响应拦截
instance.interceptors.response.use(
  result => {
    // 如果是 blob 类型的响应（文件下载），直接返回整个响应对象
    if (result.config.responseType === 'blob') {
      return result
    }

    // 适配后端返回格式：code 为 200 表示成功
    if (result.data.code === 200 || result.data.code === 0) {
      return result.data
    }

    // 处理登录异常（token失效等）- code: 213(token非法) 或 214(token过期)
    if (result.data.code === 213 || result.data.code === 214 ||
      (result.data.code === 500 && result.data.message && result.data.message.includes('登录'))) {
      // 清除 localStorage 中的用户信息
      localStorage.removeItem('userInfo')
      ElMessage.error("登录已过期，请重新登录")
      // 动态导入 router，避免循环依赖
      import('@/router').then(({ default: router }) => {
        router.push('/login')
      })
      return Promise.reject(result.data)
    }

    ElMessage.error(result.data.message ? result.data.message : '服务异常')
    return Promise.reject(result.data)

  },
  error => {
    // 处理网络错误或其他HTTP错误
    if (error.response && error.response.status === 401) {
      // 清除 localStorage 中的用户信息
      localStorage.removeItem('userInfo')
      ElMessage.error("登录已过期，请重新登录")
      // 动态导入 router，避免循环依赖
      import('@/router').then(({ default: router }) => {
        router.push('/login')
      })
    } else {
      ElMessage.error('服务异常')
    }
    return Promise.reject(error)
  }
)

export default instance
